import serial
import time 
from serial.tools import list_ports

class ultrasonic:
    #初始化函数,并直接运行
    def __init__(self):
        ports= list_ports.comports()            #得到电脑已经插入设备并可用的串行设备
        #打印出串口编号，名字,以及硬件编号
        for port, com_name, hwid in sorted(ports):
            print(port,com_name)
        self.ser = serial.Serial()      #将这个方法进行实例化
        self.port_open_recv()
        self.comport()

    #初始化串口波特率以及超时时间
    def port_open_recv(self):               #对串口的参数进行配置
        ser = self.ser
        ser.port='com30'                    #设置需要打开串口号
        ser.baudrate=9600                   #设置波特率
        ser.bytesize=8                      #设置校验位
        ser.stopbits=1                      #停止位
        ser.parity="N"                      #奇偶校验位(n为关闭)
        ser.open()                          #打开串口
        if(ser.isOpen()):                   #isOpen()函数来查看串口的开闭状态
            print("串口打开成功！")
        else:
            print("串口打开失败！")
        ser.write(b"h")
        time.sleep(0.5)
        print(1)
        self.read = ser.read_all()
        ser.close()

    #计算数据函数
    def comport(self):
        reads = self.read
        print(reads)
        c = 0                              #创建一个计数器
        com_data = reads[1:9]              #从串口得到的数据
        list1,list2 = [],[]                #创建两个空的列表
        for i in com_data:                 #遍历byte字符串的文件
            c+=1                           #c自增
            list1.append(hex(i))           #把转换成16进制的i的数值加入列表
            if c == 2:                     #当c遍历到列表2的位置时
                #将列表中的两个16进制数字拼接起来,用replace将函数中0x替换掉,并用int转换成10进制
                s = int(''.join(list1).replace('0x', ''), 16)
                c = 0                      #将计时器清空
                list2.append(s)            #把得出的mm数值传入列表
                list1 = []                 #清空一号列表
        print(list2)
        return list2                       #把二号列表作为最终结果返回
    
        
if __name__ == '__main__': 
    main = ultrasonic()